package com.atguigu.system.service.impl;

import com.atguigu.model.system.SysMenu;
import com.atguigu.model.system.SysRoleMenu;
import com.atguigu.model.vo.AssginMenuVo;
import com.atguigu.model.vo.RouterVo;
import com.atguigu.system.exception.GuiguException;
import com.atguigu.system.mapper.SysMenuMapper;
import com.atguigu.system.service.SysMenuService;
import com.atguigu.system.service.SysRoleMenuService;
import com.atguigu.system.utils.MenuHelper;
import com.atguigu.system.utils.RouterHelper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 菜单表 服务实现类
 * </p>
 *
 * @author lemon
 * @since 2023-01-22
 */
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {

    @Resource
    private SysRoleMenuService sysRoleMenuService;

    /**
     * 根据用户id查询权限菜单
     *
     * @param userId
     * @return
     */
    @Override
    public List<RouterVo> getUerMenuList(String userId) {
        // admin是超级管理员， 操作所有内容
        List<SysMenu> sysMenuList = null;
        // 如果id是1的话就是超级管理员 就查询全部就可以了
        if ("1".equals(userId)) {
            LambdaQueryWrapper<SysMenu> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(SysMenu::getStatus, 1);
            lambdaQueryWrapper.orderByDesc(SysMenu::getSortValue);
            // 表示是超级管理员
            sysMenuList = list(lambdaQueryWrapper);
        } else {
            // 不是超级管理员
            // 根据用户id查询权限数据
            sysMenuList = baseMapper.getUerMenuList(userId);

        }

        // 构建是树形的结构
        List<SysMenu> sysMenusTree = MenuHelper.buildTree(sysMenuList);

        // 需要变成前端路由里面的index.js里面的文件的样式
        List<RouterVo> routerVoList = RouterHelper.buildRouters(sysMenusTree);

        return routerVoList;
    }

    /**
     * 获取菜单
     *
     * @return
     */
    @Override
    public List<SysMenu> findNodes() {
        //全部权限列表
        List<SysMenu> sysMenuList = this.list();
        if (CollectionUtils.isEmpty(sysMenuList)) {
            return null;
        }

        //构建树形数据
        List<SysMenu> sysMenus = MenuHelper.buildTree(sysMenuList);
        return sysMenus;
    }

    /**
     * 如果有下属结点就不能进行删除
     *
     * @param id
     */
    @Override
    public void removeMenuById(Long id) {
        LambdaQueryWrapper<SysMenu> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SysMenu::getParentId, id);
        int count = count(lambdaQueryWrapper);
        if (count > 0) {
            throw new GuiguException(201, "有子菜单不能进行删除");
        }
        removeById(id);
        return;
    }

    /**
     * 根据角色获取菜单
     *
     * @param roleId
     * @return
     */
    @Override
    public List<SysMenu> findSysMenuByRoleId(Long roleId) {
        //获取所有status为1的权限列表
        LambdaQueryWrapper<SysMenu> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SysMenu::getStatus, 1);
        List<SysMenu> menuList = list(lambdaQueryWrapper);

        // 获取这个角色的全部权限
        List<SysRoleMenu> roleMenus = sysRoleMenuService.getMenusByRoleId(roleId);

        //获取该角色已分配的所有权限id
        List<String> roleMenuIds = new ArrayList<>();
        for (SysRoleMenu roleMenu : roleMenus) {
            String menuId = roleMenu.getMenuId();
            roleMenuIds.add(menuId);
        }

        //遍历所有权限列表
        for (SysMenu sysMenu : menuList) {
            if (roleMenuIds.contains(sysMenu.getId())) {
                //设置该权限已被分配
                sysMenu.setSelect(true);
            } else {
                sysMenu.setSelect(false);
            }
        }
        //将权限列表转换为权限树
        List<SysMenu> sysMenus = MenuHelper.buildTree(menuList);
        return sysMenus;
    }

    /**
     * 给角色分配权限
     *
     * @param assginMenuVo
     */
    @Override
    public void doAssign(AssginMenuVo assginMenuVo) {
        // 先删除原来的
        LambdaQueryWrapper<SysRoleMenu> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SysRoleMenu::getRoleId, assginMenuVo.getRoleId());
        sysRoleMenuService.remove(lambdaQueryWrapper);

        // 又重新加入进去
        //遍历所有已选择的权限id
        for (String menuId : assginMenuVo.getMenuIdList()) {
            if (menuId != null) {
                //创建SysRoleMenu对象
                SysRoleMenu sysRoleMenu = new SysRoleMenu();
                sysRoleMenu.setMenuId(menuId);
                sysRoleMenu.setRoleId(assginMenuVo.getRoleId());
                //添加新权限
                sysRoleMenuService.save(sysRoleMenu);
            }
        }

    }

    /**
     * 根据用户id获取用户按钮权限
     *
     * @param userId
     * @return
     */
    @Override
    public List<String> findUserPermsList(String userId) {
        List<SysMenu> sysMenuList = null;
        // 判断是否是超级管理员
        if ("1".equals(userId)) {
            LambdaQueryWrapper<SysMenu> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(SysMenu::getStatus, 1); // 状态必须可以使用
            sysMenuList = list(lambdaQueryWrapper);
        } else {
            // 如果不是超级管理员的话
            // 根据用户id查询可以使用的按钮(也就是获取菜单)
            sysMenuList = baseMapper.getUerMenuList(userId);
        }
        // sysMenuList遍历
        List<String> permissionList = new ArrayList<>();
        for (SysMenu sysMenu : sysMenuList) {
            // 如果type == 2
            if (2 ==sysMenu.getType()) {
                permissionList.add(sysMenu.getPerms());
            }
        }
        return permissionList;
    }
}
